code source game Bi-a 3D

23.683 lượt xem;
1 using System;
2 using
System.Collections;
3 using
System.Linq;
4 using
UnityEngine;
5 using
UnityEngine.UI;
6 using
ThreeDPool.EventHandlers;
7 using
ThreeDPool.Managers;
8
9 namespace
ThreeDPool.UIControllers
10 {
11     
public class GameUIScreen : MonoBehaviour
12     {
13         
[SerializeField]
14         
private GameObject _pausePageGo;
15
16         
[SerializeField]
17         
private VerticalLayoutGroup _playerGridGroup;
18
19         
[SerializeField]
20         
private GameObject _playerUITemplate;
21
22         
[SerializeField]
23         
private GameObject _loadingTextGo;
24
25         
[SerializeField]
26         
private GameObject _quitButtonGo;
27
28         
[SerializeField]
29         
private Text _gameComplete;
30
31         
private void Start()
32         {
33             
// subscribe
34             EventManager.Subscribe(
typeof(GameInputEvent).Name, OnGameInput);
35             EventManager.Subscribe(
typeof(ScoreUpdateEvent).Name, OnScoreUpdate);
36             EventManager.Subscribe(
typeof(GameStateEvent).Name, OnPlayerTurnChanged);
37         }
38
39         
private void OnDestroy()
40         {
41             
// unsubscribe
42             EventManager.Unsubscribe(
typeof(GameInputEvent).Name, OnGameInput);
43             EventManager.Unsubscribe(
typeof(ScoreUpdateEvent).Name, OnScoreUpdate);
44             EventManager.Unsubscribe(
typeof(GameStateEvent).Name, OnPlayerTurnChanged);
45         }
46
47         
private void OnScoreUpdate(object sender, IGameEvent gameEvent)
48         {
49             
try {
50                 
// since the score update is made by the player, the sender of this event should be the player
51                 Player player = (Player)sender;
52
53                 PlayerUIController[] playerUIControllers = _playerGridGroup.GetComponentsInChildren<PlayerUIController>();
54                 
if (playerUIControllers != null && playerUIControllers.Length > 0)
55                 {
56                     PlayerUIController playerUIController = playerUIControllers.FirstOrDefault(p => p.name.Equals(player.Name));
57                     playerUIController.NameNScore.text = player.Name +
" " + player.Score;
58                 }
59             }
60             
catch (Exception)
61             {
62                 
63             }
64         }
65
66         
private void OnPlayerTurnChanged(object sender, IGameEvent gameEvent)
67         {
68             GameStateEvent gameStateEvent = (GameStateEvent)gameEvent;
69
70             
if (gameStateEvent.GameState == GameStateEvent.State.Complete)
71             {
72                 
string winningText = string.Empty;
73
74                 
// not considering to show the draw message here, as everyone is a winner
75                 
if (GameManager.Instance.Winners.Length > 1)
76                 {
77                     winningText =
"Game Complete, Winners are ";
78
79                     
foreach (var winner in GameManager.Instance.Winners)
80                         winningText += winner +
" ";
81                 }
82                 
else
83                 {
84                     winningText =
"Game Complete, Winner is " + GameManager.Instance.Winners[0];
85                 }
86
87                 GameManager.Instance.ChangeGameState(GameManager.GameState.Practise);
88
89                 _gameComplete.text = winningText;
90
91                 _pausePageGo.SetActive(
true);
92                 _quitButtonGo.SetActive(
true);
93
94                 StartCoroutine(ClearWinningMessage());
95             }
96             
else {
97                 
string currPlayerName = gameStateEvent.CurrPlayer;
98                 
if (!string.IsNullOrEmpty(currPlayerName))
99                 {
100                     PlayerUIController[] playerUIControllers = _playerGridGroup.GetComponentsInChildren<PlayerUIController>();
101                     
if (playerUIControllers != null && playerUIControllers.Length > 0)
102                     {
103                         
foreach (var playerUIController in playerUIControllers)
104                         {
105                             
if (playerUIController.gameObject.name.Equals(currPlayerName))
106                                 playerUIController.TurnMarker.enabled =
true;
107                             
else
108                                 playerUIController.TurnMarker.enabled =
false;
109                         }
110                     }
111                 }
112             }
113         }
114
115         
private void OnGameInput(object sender, IGameEvent gameEvent)
116         {
117             GameInputEvent gameInputEvent = (GameInputEvent)gameEvent;
118             
switch(gameInputEvent.State)
119             {
120                 
case GameInputEvent.States.Paused:
121                         OnPause();
122                     
break;
123             }
124         }
125
126         
private IEnumerator ClearWinningMessage()
127         {
128             
yield return new WaitForSeconds(5);
129             _gameComplete.text =
string.Empty;
130         }
131
132         
private void OnPause()
133         {
134             _pausePageGo.SetActive(
true);
135             _quitButtonGo.SetActive(
true);
136             GameManager.Instance.OnPaused();
137         }

138
139         ///
<summary>
140         ///
this function is invoked by the Play Button in unity scene
141         ///
</summary>
142         
private void OnPlayPressed()
143         {
144             _pausePageGo.SetActive(
false);
145
146             StartCoroutine(StartGame());
147         }
148
149         
private void OnQuitPressed()
150         {
151             Application.Quit();
152         }
153
154         
private IEnumerator StartGame()
155         {
156             
// show loading text
157             _loadingTextGo.SetActive(
true);
158
159             
if (GameManager.Instance.CurrGameState == GameManager.GameState.Practise)
160             {
161                 
// give enough time for the ball, cue and camera to return back to its original position
162                 EventManager.Notify(
typeof(GameStateEvent).Name, this, new GameStateEvent() { GameState = GameStateEvent.State.Play });
163             }
164
165             GameManager.Instance.OnGetSet();
166             
yield return new WaitForSeconds (3);
167
168             
if (GameManager.Instance.PrevGameState == GameManager.GameState.Practise)
169             {
170                 
// reset score message
171                 PlayerUIController[] playerUIControllers = _playerGridGroup.GetComponentsInChildren<PlayerUIController>();
172                 
if (playerUIControllers != null && playerUIControllers.Length > 0)
173                 {
174                     
foreach (var playerUIController in playerUIControllers)
175                         playerUIController.NameNScore.text = playerUIController.gameObject.name +
" " + 0;
176                 }
177
178                 GameManager.Instance.OnPlay();
179
180                 
if (GameManager.Instance.NumOfTimesPlayed == 1)
181                 {
182                     
// set first player as the one taking the turn
183                     SetFirstPlayerToBreakShot();
184                 }
185             }
186             
else
187             {
188                 GameManager.Instance.OnContinue();
189             }
190
191             
// hide loading text
192             _loadingTextGo.SetActive(
false);
193
194             
// show the players
195             _playerGridGroup.gameObject.SetActive(
true);
196         }
197
198         
private void SetFirstPlayerToBreakShot()
199         {
200             PlayerUIController[] playerUIControllers = _playerGridGroup.GetComponentsInChildren<PlayerUIController>();
201             
if (playerUIControllers != null && playerUIControllers.Length > 0)
202                 playerUIControllers[
0].TurnMarker.enabled = true;
203         }
204
205         
public void CreatePlayerUI()
206         {
207             
foreach(var player in GameManager.Instance.Players)
208             {
209                 GameObject playerUIGo = Instantiate(_playerUITemplate);
210                 playerUIGo.name = player.Name;
211                 PlayerUIController playerUIController = playerUIGo.GetComponent<PlayerUIController>();
212                 playerUIController.NameNScore.text = player.Name +
" " + player.Score.ToString();
213                 playerUIController.TurnMarker.enabled =
false;
214                 playerUIGo.transform.SetParent(_playerGridGroup.transform);
215             }
216         }
217     }
218 }


Gõ tìm kiếm nhanh...